const fork = require("child_process").fork;

const cpuCount = require("os").cpus().length;

const path = require("path");

const workerPath = path.resolve(__dirname, "./worker.js");

console.log(cpuCount);

const server = require("net").createServer().listen(10000);

server.on("error", (error) => {
  console.log();
  console.log(error);
});

// 进程之间的通讯无非是， pipe管道， 消息队列，Domain Socket， 信号量；
// 在 nodejs 中是通过管道来实现的； pipe 的作用于血缘关系的进程，通过 fork 传递，
// 其自身也是一个进程，将一个进程的输出作为另一个进程的输入，常见的就是 liunx 中的 | 管道符；

// 使用 RoundRobin(rr- 轮询) 进行负载均衡的方式， 这个是一个中无状态的轮询；
/*
  是每一次把来自用户的请求轮流分配给内部中的服务器，从1开始，直到N(内部服务器个数)，然后重新开始循环。
  算法的优点是其简洁性，它无需记录当前所有连接的状态，所以它是一种无状态调度
  适合各个服务器的配置，请求均衡的情况
*/

/*
  Weighted Round-Robin 权重负载均衡轮询算法: 根据服务器的性能来均衡分配请求
*/

/*
  在 nodejs 中我们是一台机器开多进程的模式，那么不存在服务器配置的差距，
  除了 window 其他的都是默认的 RR 策略
*/

/*
  在 nodejs 中有一个是 Shared Socket 的轮询策略，由操作系统的内核来调度由那个进程处理请求
 */

const workers = [];
for (let i = 0; i < cpuCount; i++) {
  const worker = fork(workerPath);
  console.log(
    "worker process created, pid: %s ppid: %s",
    worker.pid,
    process.pid
  );
  // 将 server 传递给 子进程
  worker.send("server", server);
  workers.push(worker);
  // send 方法只能传递 net.Server or net.Socket
  // worker.send("data", { a: 10 });
}

process.on("exit", () => {
  console.log("退出");
  workers.forEach((w) => {
    w.disconnect();
  });
});

// process.on("")
